package mine.code.thread;

import org.junit.Test;

/**
 * 我们提供了一个类：
 * <p>
 * public class Foo {
 *   public void one() { print("one"); }
 *   public void two() { print("two"); }
 *   public void three() { print("three"); }
 * }
 * 三个不同的线程将会共用一个 Foo 实例。
 * <p>
 * 线程 A 将会调用 one() 方法
 * 线程 B 将会调用 two() 方法
 * 线程 C 将会调用 three() 方法
 * 请设计修改程序，以确保 two() 方法在 one() 方法之后被执行，three() 方法在 two() 方法之后被执行。
 * <p>
 * 输入: [1,3,2]
 * 输出: "onetwothree"
 * 解释:
 * 输入 [1,3,2] 表示线程 A 将会调用 one() 方法，线程 B 将会调用 three() 方法，线程 C 将会调用 two() 方法。
 * 正确的输出是 "onetwothree"。
 *
 * @author caijinnan
 * @date 2020/4/10 15:32
 */
public class 按序打印 {
    @Test
    public void run() {
    }

    public 按序打印() {

    }

    boolean firstRun = false;
    boolean secondRun = false;

    public void first(Runnable printFirst) throws InterruptedException {
        // printFirst.run() outputs "first". Do not change or remove this line.
        printFirst.run();
        firstRun = true;
    }

    public void second(Runnable printSecond) throws InterruptedException {
        while (!firstRun) {
        }
        // printSecond.run() outputs "second". Do not change or remove this line.
        printSecond.run();
        secondRun = true;
    }

    public void third(Runnable printThird) throws InterruptedException {
        while (!secondRun) {
        }
        // printThird.run() outputs "third". Do not change or remove this line.
        printThird.run();
    }
}